home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-09-09 | 9.4 KB | 395 lines | [TEXT/MMCC] |
- // An example of using ColorSync 2.1 procedure-based profiles
- // to read and write to resource profiles
- //
- // Copyright 1996, Apple Computer,Inc
- //
-
-
- #ifndef __STDIO__
- #include <Stdio.h>
- #endif
- #ifndef __TYPES__
- #include <Types.h>
- #endif
- #ifndef __TRAPS__
- #include <Traps.h>
- #endif
- #ifndef __CMAPPLICATION__
- #include <CMApplication.h>
- #endif
- #ifndef __RESOURCES__
- #include <Resources.h>
- #endif
- #ifndef __FOLDERS__
- #include <Folders.h>
- #endif
-
- #ifndef __PROCEDUREPROFILE__
- #include "ProcedureProfile.h"
- #endif
-
-
- //===========================================================
- // PRIVATE STRUCTURE TYPEDEFS
- //===========================================================
-
- struct MyResourceLocRec
- {
- FSSpec resFileSpec ;
- ResType resType ;
- short resID ;
- short resFileRef ;
- Handle resHandle ;
- CMProfileAccessUPP proc ;
- Str255 resName ;
- };
-
- typedef struct MyResourceLocRec MyResourceLocRec, *MyResourceLocPtr ;
-
-
- //===========================================================
- // PRIVATE FUNCTION PROTOTYPES
- //===========================================================
-
- static pascal OSErr MyProcedureProfileProc(long command, long offset, long *sizePtr, void *dataPtr, void* refConPtr) ;
-
- static OSErr DoBeginAccess ( void* refCon) ;
- static OSErr DoCreateNewAccess ( void* refCon);
- static OSErr DoOpenReadAccess ( void* refCon);
- static OSErr DoOpenWriteAccess ( long* setProfileSize, void* refCon);
- static OSErr DoReadAccess ( long offset, long* sizePtr, void* dataPtr, void* refCon);
- static OSErr DoCloseAccess ( void* refCon);
- static OSErr DoWriteAccess ( long offset, long* sizePtr, void* dataPtr, void* refCon);
- static OSErr DoAbortWriteAccess ( void* refCon);
- static OSErr DoEndAccess ( void* refCon);
-
-
- //===========================================================
- // PUBLIC FUNCTIONS
- //===========================================================
-
-
- /*------------------------------------------------------------------------------*\
- CreateProcedureProfileLoc
- *------------------------------------------------------------------------------*
- This routine set up a procedure-based ProfileLocation structure that
- can be used to acess profiles in resources.
-
- profileLocation On input a pointer to the CMProfileLocation structure
- to fill in.
- resourceSpec File spec ptr of the resource file to create.
- resourceName Name of the resource.
- resourceType Type of the resource.
- resourceID ID of the resource.
- \*------------------------------------------------------------------------------*/
- OSErr CreateProcedureProfileAccess( CMProfileLocation* profileLocation, FSSpec *resourceSpec,
- Str255 resourceName, OSType resourceType, short resourceID)
- {
- OSErr err = noErr;
- MyResourceLocPtr resourceInfo ;
-
- // allocate memory for our private resource info structure
- resourceInfo = (MyResourceLocPtr) NewPtrClear( sizeof(MyResourceLocRec) ) ;
- if (!resourceInfo)
- err = MemError();
-
- if (!err)
- {
- // set up our private resource info structure
- resourceInfo->resFileSpec = *resourceSpec ;
- resourceInfo->resType = resourceType ;
- resourceInfo->resID = resourceID ;
- resourceInfo->resFileRef = 0 ;
- resourceInfo->resHandle = 0 ;
- resourceInfo->proc = NewCMProfileAccessProc(MyProcedureProfileProc);
- if (resourceName)
- BlockMoveData(resourceName, resourceInfo->resName, resourceInfo->resName[0]);
-
- // set up the profile location structure
- profileLocation->locType = cmProcedureBasedProfile ;
- profileLocation->u.procLoc.refCon = (void*)resourceInfo ;
- profileLocation->u.procLoc.proc = resourceInfo->proc ;
- }
-
- return err;
- }
-
-
- /*------------------------------------------------------------------------------*\
- DisposeProcedureProfileAccess
- *------------------------------------------------------------------------------*
- This routine disposes of any data allocated by CreateProcedureProfileLoc.
-
- profileLocation On input, a pointer to the CMProfileLocation structure
- to dispose of.
- \*------------------------------------------------------------------------------*/
- void DisposeProcedureProfileAccess( CMProfileLocation *profileLocation )
- {
- DisposeRoutineDescriptor( profileLocation->u.procLoc.proc );
-
- // dispose of our private resource info structure
- DisposePtr( (Ptr)profileLocation->u.procLoc.refCon );
- }
-
-
- //===========================================================
- // PRIVATE FUNCTIONS
- //===========================================================
-
- static pascal OSErr MyProcedureProfileProc(long command, long offset, long *sizePtr, void *dataPtr, void* refConPtr)
- {
- OSErr err = noErr;
- switch (command)
- {
- case cmBeginAccess:
- err = DoBeginAccess(refConPtr) ;
- break ;
-
- case cmCreateNewAccess:
- err = DoCreateNewAccess(refConPtr);
- break ;
-
- case cmOpenReadAccess:
- err = DoOpenReadAccess(refConPtr) ;
- break ;
-
- case cmOpenWriteAccess:
- err = DoOpenWriteAccess(sizePtr, refConPtr) ;
- break ;
-
- case cmReadAccess:
- err = DoReadAccess(offset, sizePtr, dataPtr, refConPtr);
- break ;
-
- case cmWriteAccess:
- err = DoWriteAccess(offset, sizePtr, dataPtr, refConPtr);
- break ;
-
- case cmCloseAccess:
- err = DoCloseAccess(refConPtr);
- break ;
-
- case cmAbortWriteAccess:
- err = DoAbortWriteAccess(refConPtr);
- break ;
-
- case cmEndAccess:
- err = DoEndAccess(refConPtr);
- break ;
-
- default:
- err = paramErr;
- break ;
- }
-
- return err ;
- }
-
-
- static OSErr DoCreateNewAccess ( void* refcon )
- {
- OSErr err;
- MyResourceLocPtr resourceInfo = refcon;
-
- FSpCreateResFile( &(resourceInfo->resFileSpec), '????', 'rprf', 0);
- err = ResError() ;
- if (err == dupFNErr)
- err = noErr;
-
- return err;
- }
-
-
- static OSErr DoBeginAccess ( void* refcon )
- {
- OSErr err;
- MyResourceLocPtr resourceInfo = refcon;
-
- resourceInfo->resFileRef = 0 ;
-
- if ( resourceInfo->resType != kProcResourceType)
- err = cmInvalidProfileLocation ;
- else
- err = noErr;
-
- return err;
- }
-
-
- static OSErr DoOpenReadAccess ( void* refcon )
- {
- OSErr err;
- MyResourceLocPtr resourceInfo = refcon;
- short currentResFile ;
-
- currentResFile = CurResFile() ;
-
- // open the file's resource fork
- resourceInfo->resFileRef = FSpOpenResFile( &(resourceInfo->resFileSpec), fsRdPerm);
- err = ResError();
-
- // load the resource with ResLoad false
- if (!err)
- {
- SetResLoad(false) ;
- resourceInfo->resHandle = GetResource( resourceInfo->resType, resourceInfo->resID );
- err = ResError() ;
- SetResLoad(true);
- }
-
- UseResFile(currentResFile);
-
- return err;
- }
-
-
- static OSErr DoOpenWriteAccess( long* setProfileSize, void* refcon )
- {
- OSErr err;
- MyResourceLocPtr resourceInfo = refcon;
- Size resourceSize ;
- short currentResFile ;
-
- currentResFile = CurResFile() ;
-
- // open the file's resource fork
- resourceInfo->resFileRef = FSpOpenResFile( &(resourceInfo->resFileSpec), fsRdWrPerm);
- err = ResError() ;
-
- // load the resource with ResLoad false
- if (!err)
- {
- SetResLoad(false) ;
- resourceInfo->resHandle = GetResource( resourceInfo->resType, resourceInfo->resID );
- err = ResError() ;
- SetResLoad(true);
- }
-
- // call GetResourceSizeOnDisk to see is there alread is a resource there
- if (!err)
- {
- resourceSize = GetResourceSizeOnDisk(resourceInfo->resHandle); /* get size of the resource */
- err = ResError();
- }
-
- // if the above call to GetResourceSizeOnDisk returns resNotFound
- // the we need to create a new resource
- if ( err==resNotFound )
- {
- // allocate a temporary handle just so that we can call AddResource
- resourceInfo->resHandle = NewHandle(sizeof(long));
- err = MemError() ;
-
- // add resource to the file an relase the temp handle
- if (!err)
- {
- AddResource( resourceInfo->resHandle, resourceInfo->resType,
- resourceInfo->resID, resourceInfo->resName );
- err = ResError();
- ReleaseResource(resourceInfo->resHandle);
- }
-
- // reload the resource with ResLoad false
- if (!err)
- {
- SetResLoad(false) ;
- resourceInfo->resHandle = GetResource( resourceInfo->resType, resourceInfo->resID );
- err = ResError() ;
- SetResLoad(true);
- }
- }
-
- // change the resource size
- if (!err)
- {
- SetResourceSize( resourceInfo->resHandle, *setProfileSize);
- err = ResError();
- }
-
- // force an update of the resource file
- if (!err)
- {
- UpdateResFile( resourceInfo->resFileRef);
- err = ResError();
- }
-
- UseResFile(currentResFile);
-
- return err;
- }
-
-
- static OSErr DoReadAccess(long offset, long* sizePtr, void* dataPtr, void* refcon )
- {
-
- OSErr err;
- MyResourceLocPtr resourceInfo = refcon;
-
- ReadPartialResource(resourceInfo->resHandle, offset, dataPtr, *sizePtr) ;
- err = ResError() ;
-
- return err;
- }
-
-
- static OSErr DoWriteAccess (long offset, long* sizePtr, void* dataPtr, void* refcon)
- {
- OSErr err;
- MyResourceLocPtr resourceInfo = refcon;
-
- WritePartialResource(resourceInfo->resHandle, offset, dataPtr, *sizePtr);
- err = ResError();
-
- return err;
- }
-
-
- static OSErr DoAbortWriteAccess ( void* refcon )
- {
- OSErr err;
- MyResourceLocPtr resourceInfo = refcon;
-
- // delete the resource that we started
- if (resourceInfo->resHandle)
- {
- RemoveResource(resourceInfo->resHandle);
- err = ResError();
- }
- else err = paramErr;
-
- return err;
- }
-
-
- static OSErr DoCloseAccess ( void* refcon )
- {
- OSErr err;
- MyResourceLocPtr resourceInfo = refcon;
-
- // close and update resource file
- if (resourceInfo->resFileRef)
- {
- CloseResFile( resourceInfo->resFileRef ) ;
- err = ResError() ;
- resourceInfo->resFileRef = 0 ;
- }
- else err = paramErr;
-
- return err;
- }
-
-
- static OSErr DoEndAccess (void* refcon)
- {
- OSErr err;
- MyResourceLocPtr resourceInfo = refcon;
-
- err = noErr;
-
- return err;
- }
-
-
-
-
-